package com.eight.vote.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.eight.vote.pojo.VUser;
import com.eight.vote.mapper.VUserMapper;
import com.eight.vote.service.VUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.eight.vote.util.JWTUtil;
import com.eight.vote.util.MD5Util;
import com.eight.vote.util.Result;
import com.eight.vote.util.UserHolder;
import com.eight.vote.vo.LoginFrom;
import com.eight.vote.vo.UpdatePasswordVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 点点星言
 * @since 2022-10-16
 */
@Service
@Slf4j
public class VUserServiceImpl extends ServiceImpl<VUserMapper, VUser> implements VUserService {

    @Override
    public Result login(LoginFrom loginFrom) {
        String name = loginFrom.getName();
        //用昵称检索数据库
        VUser nameFromDB = query().eq("name", name).one();

        if (nameFromDB == null) {
            //不存在，直接报用户不存在异常
            return Result.fail("用户不存在");
        }
        //存在，对密码进行MD5加密
        String password = loginFrom.getPassword();
        String md5Password = MD5Util.getMD5(password);
        String dbPassword = nameFromDB.getPassword();
        //进行对比
        if (!md5Password.equals(dbPassword)) {
            //不相同，报密码错误异常
            return Result.fail("密码错误!请重新输入");
        }
        //相同，生成token
        String token = JWTUtil.generateToken(nameFromDB.getUserId().toString(), null);
        //封装token，返回前端
        return Result.ok(token);
    }

    @Override
    public Result register(LoginFrom loginFrom) {
        //获取两个值
        String name = loginFrom.getName();
        String password = loginFrom.getPassword();
        //先用name查表
        VUser nameFromDB = query().eq("name", name).one();
        //存在，直接报用户名已存在异常
        if (nameFromDB!=null) {
            return Result.fail("用户名已存在，请重新输入");
        }
        //不存在，对密码进行加密
        String md5Password = MD5Util.getMD5(password);
        //存表
        VUser vUser = new VUser();
        vUser.setName(loginFrom.getName());
        vUser.setPassword(md5Password);
        baseMapper.insert(vUser);
        //然后生成token
        String token = JWTUtil.generateToken(vUser.getUserId().toString(), null);
        //封装token返回
        return Result.ok(token);
    }

    @Override
    public Result updateUser(VUser user) {
        //获取userId
        Long userId = UserHolder.getUserId();
        //进行数据校验
        if (user.getPassword()!=null) {
            return Result.fail("不允许修改密码");
        }
        //构建更新规则
        user.setUserId(userId);
        updateById(user);
        //更新数据库
        return Result.ok();
    }

    @Override
    public Result updatePassword(UpdatePasswordVO updatePasswordVO) {
        //获取各项参数
        Long userId = UserHolder.getUserId();
        String oldPassword = updatePasswordVO.getOldPassword();
        String newPassword = updatePasswordVO.getNewPassword();
        String md5OldPassword = MD5Util.getMD5(oldPassword);
        //根据userId获取对象
        VUser user = getById(userId);
        log.debug("旧密码：{}",md5OldPassword);
        log.debug("数据库中的密码：{}",user.getPassword());
        //将旧密码加密与数据库中的密码对比
        if (!md5OldPassword.equals(user.getPassword())) {
            //不相同，报密码错误
            return Result.fail("密码错误，请重新输入");
        }
        UpdateWrapper<VUser> wrapper = new UpdateWrapper<>();
        wrapper.set("password",MD5Util.getMD5(newPassword)).eq("user_id",userId);
        //相同，存表入库
        update(wrapper);
        return Result.ok();
    }



}
